我們在Day19的時候有說過在Servlet中如何處理程式運行中的錯誤並導向錯誤頁面,今天我們就來瞧瞧Spring MVC如何來處理這一塊的問題
錯誤處理分為編程式異常處理也就是透過Try-catch block、throw的方式來處理,當處理的量一多到處都是充斥著Try-catch block、throw屆時就會越變得比較不好維護,與之對比聲明式異常處理可以將錯誤訊息集中管理,開發人員可以更集中在商業邏輯開發,這樣的作法會是相對比較推薦的
(1) 請參考Day27 module
(2) 使用JSON相關設置請參考Day29
Spring MVC提供了定義了一個Interface HandleExceptionResolver來處理Exception,並有兩個實作類別SimpleMappingExceptionResolver、DefaultHandlerExceptionResolve,若想要使用自訂義的異常處理我們可以配置SimpleMappingExceptionResolver來達成
springmvc-servlet.xml配置
<bean
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<!--
出現指定異常則返回特定葉面
-->
<prop key="java.lang.ArithmeticException">error</prop>
</props>
</property>
<!--
透過屬性設置exceptionAttribute,頁面可以共享此數據
-->
<property name="exceptionAttribute" value="ex"></property>
</bean>
error.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Exception Demo</title>
</head>
<body>
<h3>Exception Demo</h3>
${ex.message}
</body>
</html>
controller
@Controller
@ResponseBody
public class ExceptionDemoController {
@GetMapping("Demo1")
public String Demo1(){
int i = 1/0;
return "Demo1";
}
}
配置局部的ExceptionHandler
記得先把Demo1配置的SimpleMappingExceptionResolver註解起來
@Controller
public class ExceptionDemoAnnotationController {
@GetMapping("Demo2")
public String Demo2(){
int[] arr = new int[10];
arr[10] = 1;
return "Hello Demo2";
}
@ExceptionHandler(Exception.class)
public String HandleDemo2Exception(Exception ex, Model model){
model.addAttribute("ex",ex);
return "error";
}
}
透過此註解可以統一集中管理Exception處理
ExceptionAdviceDemoController
@Controller
@ResponseBody
public class ExceptionAdviceDemoController {
@GetMapping("Demo3")
public String Demo3() throws FileNotFoundException {
File file = new File("D://abc.txt");
FileInputStream fis = new FileInputStream(file);
return "Hello Demo3";
}
}
GlobalExceptionHandler
@ControllerAdvice
@RestController
public class GlobalExceptionHandler {
@ExceptionHandler(ArithmeticException.class)
public String handleArithmeticException(Exception e) {
return "handle ArithmeticException";
}
@ExceptionHandler(FileNotFoundException.class)
public String handleFileNotFoundException(Exception e) {
return "handle FileNotFoundException";
}
@ExceptionHandler(IndexOutOfBoundsException.class)
public String handleIndexOutOfBoundsException(Exception e) {
return "handle IndexOutOfBoundsException";
}
}
demo01
demo02,當Controller中有ExceptionHandler時,會以該Controller中的Handler優先
demo03